package com.example.spring.multi.basic.thread;


import java.util.concurrent.locks.StampedLock;



/**
 * @author tomato
 * @ClassName StampedSample
 * @description: StampedLock简单示例 （StampedLock提供了乐观读锁，可取代ReadWriteLock以进一步提升并发性能）
 * @date 2023年07月08日 10:23
 * @version: 1.0
 */
public class StampedSample {
    private final StampedLock sl = new StampedLock();

    void mutate() {
        long stamp = sl.writeLock();
        try {
            //write();  省略业务相关代码 写入数据
        } finally {
            sl.unlockWrite(stamp);
        }
    }

    Data access() {
        long stamp = sl.tryOptimisticRead();
        //直接读取数据，不需要加锁
        //Data data = read();
        //判断执行读操作期间，是否存在写操作，如果存在，则sl.validate返回false，需要加锁重读
        if (!sl.validate(stamp)) {
            stamp = sl.readLock();
            try {
//                data = read();
                //省略业务相关代码 读取数据
            } finally {
                sl.unlockRead(stamp);
            }
        }
        return new Data();
    }

     class Data {

    }
    // …
}

